package letcode.oneQuestionPerDay._202003._20200320;

import java.util.PriorityQueue;
import java.util.Queue;

/*
最小的k个数
    官方题解： 堆排序
 */
public class LittlestKNumber_2 {
    public static void main(String[] args) {
        int[] arr={3,2,1};
        int k=3;
        int[] newArr=getLeastNumbers(arr,k);
        for (int i:newArr
             ) {
            System.out.println(i);
        }

    }
    public static int[] getLeastNumbers(int[] arr, int k) {
        if (k==0){
            return new int[0];
        }
        //使用一个大顶堆。Java默认为小顶堆，需要添加comparator参数变成大顶堆
        Queue<Integer> heap=new PriorityQueue<>(k,(i1,i2)->Integer.compare(i2,i1));

        //元素入堆。如果大于size的话则直接出堆
        for (int e:arr
             ) {
            heap.add(e);
            if (heap.size()>k){
                heap.poll();
            }
        }

        //将堆中的元素存入数组
        int[] res=new int[heap.size()];
        int j=0;
        for (int e:heap
             ) {
            res[j++]=e;
        }
        return res;
    }
}
/*
输入整数数组 arr ，找出其中最小的 k 个数。例如，输入4、5、1、6、2、7、3、8这8个数字，则最小的4个数字是1、2、3、4。


示例 1：

输入：arr = [3,2,1], k = 2
输出：[1,2] 或者 [2,1]
示例 2：

输入：arr = [0,1,2,1], k = 1
输出：[0]
 */